package com.jiang.redis.single;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author jiangwz
 * @create 2019/3/7.
 */
public class TestRedisPool {


    private static JedisPool jedisPool = null;

    private static void initialPool(){
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(600);
            config.setMaxIdle(300);
            config.setMaxWaitMillis(10000);
            config.setTestOnBorrow(false);
            jedisPool = new JedisPool(config,"localhost",6379,10000,null);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    @Before
    public void before(){
        initialPool();
    }

    @Test
    public void testGet(){
        Jedis resource = jedisPool.getResource();
        System.out.println(resource.get("6666666666"));


    }

    /**
     * 只要key中有 : 号就会分文件夹,空格不行
     */
    @Test
    public void testSetVal(){
        Jedis jedis = jedisPool.getResource();
        jedis.set("1-1", "1-1");
        jedis.set("1:1", "1");
        jedis.set("1:2", "1");
        jedis.set("2    :2", "1");
        jedis.set("2 2 2", "22");

        System.out.println(jedis.get("1-1"));
        System.out.println(jedis.get("1:1"));
        System.out.println(jedis.get("2 2 2"));

    }

    @Test
    public void testList(){
        /**
         * lrange
         * l开头表示从头往后
         * r 开头表示从尾往后
         */
        String key = "tutorial-list";
        Jedis jedis = jedisPool.getResource();
        /**
         * 往队列左侧,一个一个的加
         */
//        jedis.lpush(key, "sql","Redis","MongoDB","mysql");
        List<String> lrange = jedis.lrange(key, 0, 3);
        lrange.forEach(System.out::println);
        System.out.println("length(list长度) = "+jedis.llen(key));
        System.out.println("index(查看哪个索引) = " + jedis.lindex(key, 1));
//        System.out.println("pop(出列)=" + jedis.lpop(key));
        /**
         * 移除count个 value值
         * count > 0 : 从表头开始向表尾搜索，移除与 value 相等的元素，数量为 count 。
         * count < 0 : 从表尾开始向表头搜索，移除与 value 相等的元素，数量为 count 的绝对值。
         * count = 0 : 移除表中所有与 value 相等的值。
         */
//        jedis.lrem(key,-1, "MongoDB");
        /**
         * 对一个列表进行修剪(trim)，就是说，让列表只保留指定区间内的元素，不在指定区间之内的元素都将被删除。
         */
//        jedis.ltrim();

        /**
         * 给某个index重新设值
         */
//        jedis.lset(key, 2, "KK");

        /**
         * 在第一个mysql之前插入VV
         */
        jedis.linsert(key, BinaryClient.LIST_POSITION.BEFORE,"mysql","VV");

        /**
         * 列表为空插入失败,列表不为空,插入成功
         */
//        jedis.lpushx();//

        jedis.expire(key, 120);
    }

    /**
     * 类似于map,存一个map进去,可以单独修改某个属性,很好用,推荐使用
     */
    @Test
    public void testHash(){
        String key = "hashKey";
        Jedis jedis = jedisPool.getResource();
//        jedis.hset(key, "name", "jiangwz");
//        jedis.hset(key, "age", "18");
//        jedis.hset(key, "height", "1.8m");


        jedis.hset(key, "age", "19");
        Map<String, String> stringStringMap = jedis.hgetAll(key);
        System.out.println(stringStringMap);

        /**
         * List<String>
         */
        System.out.println(jedis.hvals(key));
    }


    /**
     * Redis的Set 集合 (无序集合)不允许重复元素
     */
    @Test
    public void testSet(){
        Jedis jedis = jedisPool.getResource();
        String key = "saddKey";
        jedis.sadd(key, "mysql","oracle","mysql");
        Set<String> smembers = jedis.smembers(key);
        System.out.println(smembers);

    }

    /**
     * 有序集合, 不允许重复元素
     * 根据score进行排序
     */
    @Test
    public void testSortedSet(){
        String key= "zaddKey";
        Jedis jedis = jedisPool.getResource();
        jedis.zadd(key, 1, "aa");
        jedis.zadd(key, 5, "dd");
        jedis.zadd(key, 2, "bb");
        jedis.zadd(key, 3, "cc");
        jedis.zadd(key, 2, "dd");

        Set<String> zrange = jedis.zrange(key, 0, 10);
        System.out.println(zrange);
    }

}
